FEXP Solver  1.0.0.0
FEXPCommon.h
Go to the documentation of this file.
1 // © FEXP, FEXPEnterprise Solver, Ing. Vaclav Rek
3 // Library for the common use.
4 // Compiler must support C++ ver.14 and later
6 #ifndef _CFEXPCOMMON_H_
7 #define _CFEXPCOMMON_H_
8 #include <cstdio>
9 #include <cstdlib>
10 #include <cstring>
11 #include <cwchar>
12 #include <cstddef>
13 #include <memory>
14 #include <numeric>
15 #include <locale>
16 #include <utility>
17 #include <sstream>
18 #include <stdarg.h>
19 #include <functional>
20 #include <string>
21 #include <vector>
22 #include <map>
23 #include <unordered_map>
24 #include <stack>
25 #include <queue>
26 #include <iostream>
27 #include <fstream>
28 #include <filesystem>
29 #include <io.h>
30 #include <iomanip>
31 #include <climits>
32 #include <algorithm>
33 #include <chrono>
34 #include <ctime>
35 #include <typeinfo>
36 #include <type_traits>
37 #include <cmath>
38 #include <array>
39 #include <typeinfo>
40 #include <typeindex>
41 #include <exception>
42 #include <thread>
43 #include <future>
44 #include <mutex>
45 #include <condition_variable>
46 #include <chrono>
47 
49 // --> Console
51 #define FEXPCOMMON_CONSOLE_OUT std::cout
52 
54 #define FEXPCOMMON_CONSOLE_SAFE_THREAD_OUT CFEXPSafeConcurencyConsolePrint{ }
55 #define FEXPCOMMON_CONSOLE_PAUSE(manager) if(!manager) system("PAUSE")
56 
58 // --> Command line content
60 // cmd line content
61 #define FEXPCOMMON_CMD_EXE_PATH_INDEX 0
62 #define FEXPCOMMON_CMD_MANAGER_INDEX 1
63 #define FEXPCOMMON_CMD_SERVER_IP_INDEX 2
64 #define FEXPCOMMON_CMD_SERVER_PORT_INDEX 3
65 #define FEXPCOMMON_CMD_MAX_LENGTH 4
66 #define FEXPCOMMON_CMD_MIN_LENGTH 2
67 
69 // --> Windows specifics
72 #include <Winsock2.h>
73 #include <Ws2tcpip.h>
74 // Windows versions constants
75 #define FEXPCOMMON_WIN_VISTA NTDDI_VISTA
76 #define FEXPCOMMON_WIN_7 NTDDI_WIN7
77 #define FEXPCOMMON_WIN_8 NTDDI_WIN8
78 #define FEXPCOMMON_WIN_10 NTDDI_WIN8 // Win 10 and 8 compatible
79 // current Win. OS version used for compilation
80 #define FEXPCOMMON_MY_WIN_VERSION_FOR_COMPILATION FEXPCOMMON_WIN_7 // development version of windows
81 
87 {
91  {
93  // 1D finite elements in 2D space
95  // 2D finite elements in 2D space
97  // 2D finite elements in 3D space
99  // 3D finite elements
102  };
103 
107  {
109  // triangular 3-noded shell finite element
111  // triangular 8-noded brick finite element
114  };
115 }
116 
120 using t_fexpcommon_ct = double;
121 
125 // macro for load of string key for respective block of base inp. data file structure
126 #define STRUCT_KEYS(fstrct, eidntfier) fstrct[(eidntfier)]
127 // lazy allocation inp. file data class block
128 #define LAZY_ALLC(alloclass, baseclass) []()->Ptr<baseclass> { return CFEXPDataManager<alloclass>::SafeAllocInstance(); }
129 // identifier of file block (enumerator)
130 #define CLS_KEY(alloclass) alloclass::ID
131 // macro for creation of pair block key <--> allocator for inp. file class
132 #define CLS_MAP_PAIR(fstrct, alloclass, baseclass) { STRUCT_KEYS(fstrct, CLS_KEY(alloclass)), LAZY_ALLC(alloclass, baseclass) }
133 
137 #define FEXPCOMMON_STACAST(clsfrom, clsto, variable) Ptr<clsfrom>::SafeSmartPtrStatCast<clsto>(variable)
138 #define FEXPCOMMON_DYNCAST(clsfrom, clsto, variable) Ptr<clsfrom>::SafeSmartPtrDnmcCast<clsto>(variable)
139 
142 // --> Macros for throwing the custom exception
143 #define FEXPCOMMON_EXCEPTION(error_text) throw std::runtime_error(error_text)
144 #define FEXPCOMMON_NOT_IMPLEMENTED_EX FEXPCOMMON_EXCEPTION("Not implemented!!!")
145 
149 #undef min // disconnect min from stdlib header
150 #undef max // disconnect max from stdlib header
151 #define FEXPCOMMON_MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
152 #define FEXPCOMMON_MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
153 #define FEXPCOMMON_FOREACH(start, end, index) for(index = (start); index <= (end); ++index)
154 #define FEXPCOMMON_FOREACH_REV(start, end, index) for(index = (start); index >= (end); --index)
155 #define IT current_item_for_each
156 #define FEXPCOMMON_FOREACH_ITER(data) for (auto IT = (data).begin(); IT != (data).end(); ++IT)
157 #define FEXPCOMMON_FOREACH_ITER_FNC(data, lambda_body) std::for_each((data).begin(), (data).end(), [&](auto IT) lambda_body)
158 
162 #define FEXPCOMMON_BUFFER_LINE_LEN 1024 // maximal length of string buffer
163 #define FEXPCOMMON_MIN_VALUE 1.0E-6 // minimum value
164 #define FEXPCOMMON_FLT_PRECISION 1.0E-7 // precision of float
165 #define FEXPCOMMON_FLT_PRECISION_DIGITS 7 // precision of float
166 #define FEXPCOMMON_FLT_MAX (std::numeric_limits<float>::max() / 2.0) // max value of float (only half of it)
167 #define FEXPCOMMON_DBL_PRECISION 1.0E-15 // precision of double
168 #define FEXPCOMMON_DBL_PRECISION_DIGITS 15 // precision of double
169 #define FEXPCOMMON_DBL_MAX (std::numeric_limits<double>::max() / 2.0) // max value of double (only half of it)
170 #define FEXPCOMMON_INVALID_INDX -1 // invalid index value
171 #define FEXPCOMMON_DEFAULT_INDX 0 // default index value
172 #define FEXPCOMMON_PI 3.14159265358979323846
173 #define FEXPCOMMON_NO_VALUE_STR "No value"
174 
176 #define FEXPCOMMON_MAXFLDS 10 // maximum possible number of fields
177 #define FEXPCOMMON_MAXFLDSIZE 32 // longest possible field + 1 = 31 byte field
178 #define FEXPCOMMON_EMPTY 0 // default length
179 #define FEXPCOMMON_DEFAULT_VALUE 0
180 #define FEXPCOMMON_DELIMITER ";" // input file item row delimiter
181 #define FEXPCOMMON_KEY_BLOCK_IDNTF "#"
182 #define FEXPCOMMON_KEY_TABLE_IDNTF "$"
183 #define FEXPCOMMON_EMPTY_STRING ""
184 #define FEXPCOMMON_EMCHR_STRING " "
185 #define FEXPCOMMON_NEW_LINE "\n"
186 #define FEXPCOMMON_QUEST_MARK_CHAR '?'
187 #define FEXPCOMMON_ZERO_END_CHAR '\0'
188 #define FEXPCOMMON_ZERO_END_WCHAR L'\0'
189 #define FEXPCOMMON_DFLT_TXT (std::string("@FEXP") + FEXPCOMMON_DELIMITER)
190 
192 #define FEXPCOMMON_DATA_TYPE(type) std::type_index(typeid(type))
193 #define FEXPCOMMON_DATA_TYPE_NAME(type) FEXPCOMMON_DATA_TYPE(type).name()
194 // type index of common types
195 #define FEXPCOMMON_CLCFLT_TYPE FEXPCOMMON_DATA_TYPE(t_fexpcommon_ct)
196 #define FEXPCOMMON_SIZE_T_TYPE FEXPCOMMON_DATA_TYPE(size_t )
197 #define FEXPCOMMON_STRING_TYPE FEXPCOMMON_DATA_TYPE(std::string )
198 // data type represantation of used types
199 #define FEXPCOMMON_CLCFLT_TYPE_NAME FEXPCOMMON_DATA_TYPE_NAME(t_fexpcommon_ct)
200 #define FEXPCOMMON_SIZE_T_TYPE_NAME FEXPCOMMON_DATA_TYPE_NAME(size_t )
201 #define FEXPCOMMON_STRING_TYPE_NAME FEXPCOMMON_DATA_TYPE_NAME(std::string )
202 
203 
205 #define GET_MAX_FLT_VAL(type) \
206 ((FEXPCOMMON_DATA_TYPE_NAME(type) == FEXPCOMMON_DATA_TYPE_NAME(float)) ?\
207 FEXPCOMMON_FLT_MAX : FEXPCOMMON_DBL_MAX)
208 
209 #define GET_MIN_FLT_VAL(type) \
210 ((FEXPCOMMON_DATA_TYPE_NAME(type) == FEXPCOMMON_DATA_TYPE_NAME(float)) ?\
211 FEXPCOMMON_FLT_PRECISION : FEXPCOMMON_DBL_PRECISION)
212 
214 #define GET_FLT_PRECIS_DIGIT(type) \
215 ((FEXPCOMMON_DATA_TYPE_NAME(type) == FEXPCOMMON_DATA_TYPE_NAME(float)) ?\
216 FEXPCOMMON_FLT_PRECISION_DIGITS : FEXPCOMMON_DBL_PRECISION_DIGITS)
217 
219 #define GET_MAX_SIZE_T_VAL() std::numeric_limits<size_t>::max()
220 
227 template <typename TFunc>
229  : std::integral_constant<bool,
230  std::is_pointer<TFunc>::value &&
231  std::is_function<typename std::remove_pointer<TFunc>::type>::value>{ };
232 
234 template <typename TClassType>
236  : public function_traits<decltype(&TClassType::operator())>{ };
237 
239 template <typename TClassType, typename TReturnType, typename... Args>
240 struct function_traits<TReturnType(TClassType::*)(Args...) const>
241 {
242  //enum { arity = sizeof...(Args) };
243  typedef std::function<TReturnType(Args...)> f_type;
244 };
245 
247 template <typename TClassType, typename TReturnType, typename... Args>
248 struct function_traits<TReturnType(TClassType::*)(Args...)>
249 {
250  typedef std::function<TReturnType(Args...)> f_type;
251 };
252 
254 template <typename TReturnType, typename... Args>
255 struct function_traits<TReturnType(*)(Args...)>
256 {
257  typedef std::function<TReturnType(Args...)> f_type;
258 };
259 
260 template <typename TLambda>
262 {
263  return (typename function_traits<TLambda>::f_type)(value);
264 }
265 
272 
274 template<typename TType> class CFEXPDataManager;
275 template<typename TType>
276 class CFEXPSmartPointer : public std::shared_ptr<TType>
277 {
278 public:
279  CFEXPSmartPointer() : std::shared_ptr<TType>() { _arr_length = FEXPCOMMON_EMPTY; }
280  CFEXPSmartPointer(const std::shared_ptr<TType> & source);
281  CFEXPSmartPointer(const std::shared_ptr<TType> & source, size_t arr_length);
282  virtual ~CFEXPSmartPointer() { }
283 
284  // overloaded operators
286 
287  // method for safe cast
288  template<typename TTo>
290  template<typename TTo>
292 
293  // extended methods for base class
295  void SetToNull () { reset(); }
296  size_t GetArrLength() const { return _arr_length; }
297 protected:
298  // [no protected members] -----------------------------
299 private:
300  // it holds the length of an allocated array
301  size_t _arr_length;
302 };
303 
304 // member functions
306 //--------------------------------------------------------------------------------------
307 template<typename TType>
308 CFEXPSmartPointer<TType>::CFEXPSmartPointer(const std::shared_ptr<TType> & source)
309  : std::shared_ptr<TType>(source), _arr_length(FEXPCOMMON_EMPTY) { }
310 //--------------------------------------------------------------------------------------
311 
312 //--------------------------------------------------------------------------------------
313 template<typename TType>
314 CFEXPSmartPointer<TType>::CFEXPSmartPointer(const std::shared_ptr<TType> & source, size_t arr_length)
315  : std::shared_ptr<TType>(source), _arr_length(arr_length) { }
316 //--------------------------------------------------------------------------------------
317 
318 //--------------------------------------------------------------------------------------
319 template<typename TType>
321 //--------------------------------------------------------------------------------------
322 {
323  std::shared_ptr<TType>::operator=(source);
324  _arr_length = source._arr_length;
325  return *this;
326 }
327 
328 //--------------------------------------------------------------------------------------
329 template<typename TType> template<typename TTo>
331 //--------------------------------------------------------------------------------------
332 {
333  return from ?
334  std::static_pointer_cast<TTo>(from) :
336 }
337 
338 //--------------------------------------------------------------------------------------
339 template<typename TType> template<typename TTo>
341 //--------------------------------------------------------------------------------------
342 {
343  return from ?
344  std::dynamic_pointer_cast<TTo>(from) :
346 }
347 
348 //--------------------------------------------------------------------------------------
349 template<typename TType>
351 //--------------------------------------------------------------------------------------
352 {
353  return *this ?
354  CFEXPDataManager::SafeAllocInstance(std::reference_wrapper<const TType>(*get())) :
356 }
357 
358 // special typedef for smart pointer
359 template<typename TType>
361 
368 
370 template<typename TType>
371 class CFEXPDataManager
372 {
373 public:
374  template<typename ...VarArgs>
375  static Ptr<TType> SafeAllocInstance (VarArgs &&... inpar);
376  static Ptr<TType> MakeAllocInstanceSafe (TType * alloc);
377  static Ptr<TType> SafeAllocInstanceArray (size_t length);
378  static Ptr<TType> MakeAllocInstanceArraySafe(TType * alloc, size_t length);
379  virtual ~CFEXPDataManager() { }
380 protected:
381  // [no protected members] -----------------------------
382 private:
383  // [no private members ] -----------------------------
384 };
385 
386 // member functions
388 
390 //--------------------------------------------------------------------------------------
391 template<typename TType> template<typename ...VarArgs>
393 //--------------------------------------------------------------------------------------
394 {
395  return std::make_shared<TType>(std::forward<VarArgs>(inpar)...);
396 }
397 
398 //--------------------------------------------------------------------------------------
399 template<typename TType>
401 //--------------------------------------------------------------------------------------
402 {
403  return Ptr<TType>(std::shared_ptr<TType>(alloc));
404 }
405 
408 //--------------------------------------------------------------------------------------
409 template<typename TType>
411 //--------------------------------------------------------------------------------------
412 {
413  return Ptr<TType>(std::shared_ptr<TType>(new TType[length],
414  std::default_delete<TType[]>()), length);
415 }
416 
417 //--------------------------------------------------------------------------------------
418 template<typename TType>
420 //--------------------------------------------------------------------------------------
421 {
422  return Ptr<TType>(std::shared_ptr<TType>(alloc), length);
423 }
424 
431 
433 template<typename TData, typename TKey>
435 {
436 public:
440 
441  Ptr<TData> GetData() { return _data; }
442  // pure virtual member functions
443  virtual TKey GetKey () = 0;
444 protected:
446 private:
447  // [no private members] -----------------------------
448 };
449 
450 // member functions
452 //--------------------------------------------------------------------------------------
453 template<typename TData, typename TKey>
455  : _data(data) { }
456 //--------------------------------------------------------------------------------------
457 
458 //--------------------------------------------------------------------------------------
459 template<typename TData, typename TKey>
461  : _data(source._data) { }
462 //--------------------------------------------------------------------------------------
463 
470 // std::map pair creation
471 #define MAP_PAIR(key, itm) std::make_pair(key, itm)
472 
473 // primary template
474 template<typename TWrapper, typename TData, typename TKey, typename Enable = void>
478 template<typename TWrapper, typename TData, typename TKey>
480  // specialization
481  <TWrapper, TData, TKey,
482  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
483 {
484 public:
486  virtual ~ICFEXPDataContainerBase();
487 
488  bool AddData (Ptr<TData> & item);
489  bool AddWrappedData(Ptr<TWrapper> & item);
490 
491  template<typename TDataSpec>
492  typename std::enable_if<std::is_base_of<TData, TDataSpec>::value, Ptr<TDataSpec>>::type
493  GetData();
494  Ptr<TData> GetData (const TKey & key);
495  Ptr<TWrapper> GetWrappedData(const TKey & key);
496 
497  bool Contains(const TKey & key);
498  bool Remove (const TKey & key);
499  void Clear ();
500  size_t Count ();
501  bool Empty ();
502 
503  // pure virtual member functions
504  virtual std::string GetContainerName() const = 0;
505 protected:
506  std::map<TKey, Ptr<TWrapper>> & get_container();
507 private:
508  std::map<TKey, Ptr<TWrapper>> _container;
509 };
510 
511 // member functions
513 //--------------------------------------------------------------------------------------
514 template<typename TWrapper, typename TData, typename TKey>
515 ICFEXPDataContainerBase<TWrapper, TData, TKey,
516  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
518 //--------------------------------------------------------------------------------------
519 
520 //--------------------------------------------------------------------------------------
521 template<typename TWrapper, typename TData, typename TKey>
522 ICFEXPDataContainerBase<TWrapper, TData, TKey,
523  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
524  ::~ICFEXPDataContainerBase()
525 //--------------------------------------------------------------------------------------
526 {
527  Clear();
528 }
529 
530 //--------------------------------------------------------------------------------------
531 template<typename TWrapper, typename TData, typename TKey>
532 bool ICFEXPDataContainerBase<TWrapper, TData, TKey,
533  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
534  ::Contains(const TKey & key)
535 //--------------------------------------------------------------------------------------
536 {
537  return bool(get_container().count(key));
538 }
539 
540 //--------------------------------------------------------------------------------------
541 template<typename TWrapper, typename TData, typename TKey>
542 bool ICFEXPDataContainerBase<TWrapper, TData, TKey,
543  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
544  ::Remove(const TKey & key)
545 //--------------------------------------------------------------------------------------
546 {
547  if (!Contains(key))
548  return false;
549  get_container().erase(get_container().find(key));
550  return true;
551 }
552 
553 //--------------------------------------------------------------------------------------
554 template<typename TWrapper, typename TData, typename TKey>
555 bool ICFEXPDataContainerBase<TWrapper, TData, TKey,
556  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
557  ::AddData(Ptr<TData> & item)
558 //--------------------------------------------------------------------------------------
559 {
560  return AddWrappedData(CFEXPDataManager<TWrapper>::SafeAllocInstance(item));
561 }
562 
563 //--------------------------------------------------------------------------------------
564 template<typename TWrapper, typename TData, typename TKey>
565 bool ICFEXPDataContainerBase<TWrapper, TData, TKey,
566  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
567  ::AddWrappedData(Ptr<TWrapper> & item)
568 //--------------------------------------------------------------------------------------
569 {
570  auto result = false;
571  if (!item)
572  return result;
573 
574  auto key = item->GetKey();
575  if (Contains(key))
576  return result;
577 
578  // is need for some compilers
579  //auto cast = FEXPCOMMON_STACAST(TWrapper, ICFEXPDataWrapperBase<TData, TKey>, item);
580  get_container().insert(MAP_PAIR(key, item));
581  return !result;
582 }
583 
584 //--------------------------------------------------------------------------------------
585 template<typename TWrapper, typename TData, typename TKey> template<typename TDataSpec>
586 typename std::enable_if<std::is_base_of<TData, TDataSpec>::value, Ptr<TDataSpec>>::type
587 ICFEXPDataContainerBase<TWrapper, TData, TKey,
588  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
589  ::GetData()
590 //--------------------------------------------------------------------------------------
591 {
592  auto cast = Ptr<TDataSpec>();
593  FEXPCOMMON_FOREACH_ITER(get_container())
594  {
595  auto ptr = (*IT).second->GetData();
596  if (!FEXPCOMMON_DYNCAST(TData, TDataSpec, ptr))
597  continue;
598  cast = FEXPCOMMON_STACAST(TData, TDataSpec, ptr);
599  break;
600  }
601  return cast;
602 }
603 
604 //--------------------------------------------------------------------------------------
605 template<typename TWrapper, typename TData, typename TKey>
606 Ptr<TData> ICFEXPDataContainerBase<TWrapper, TData, TKey,
607  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
608  ::GetData(const TKey & key)
609 //--------------------------------------------------------------------------------------
610 {
611  auto data = GetWrappedData(key);
612  return data ? data->GetData() : Ptr<TData>();
613 }
614 
615 //--------------------------------------------------------------------------------------
616 template<typename TWrapper, typename TData, typename TKey>
617 Ptr<TWrapper> ICFEXPDataContainerBase<TWrapper, TData, TKey,
618  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
619  ::GetWrappedData(const TKey & key)
620 //--------------------------------------------------------------------------------------
621 {
622  return Contains(key) ? get_container()[key] : Ptr<TWrapper>();
623 }
624 
625 //--------------------------------------------------------------------------------------
626 template<typename TWrapper, typename TData, typename TKey>
627 void ICFEXPDataContainerBase<TWrapper, TData, TKey,
628  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
629  ::Clear()
630 //--------------------------------------------------------------------------------------
631 {
632  get_container().clear();
633 }
634 
635 //--------------------------------------------------------------------------------------
636 template<typename TWrapper, typename TData, typename TKey>
637 size_t ICFEXPDataContainerBase<TWrapper, TData, TKey,
638  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
639  ::Count()
640 //--------------------------------------------------------------------------------------
641 {
642  return get_container().size();
643 }
644 
645 //--------------------------------------------------------------------------------------
646 template<typename TWrapper, typename TData, typename TKey>
647 bool ICFEXPDataContainerBase<TWrapper, TData, TKey,
648  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
649  ::Empty()
650 //--------------------------------------------------------------------------------------
651 {
652  return get_container().empty();
653 }
654 
655 //--------------------------------------------------------------------------------------
656 template<typename TWrapper, typename TData, typename TKey>
657 std::map<TKey, Ptr<TWrapper>> & ICFEXPDataContainerBase<TWrapper, TData, TKey,
658  typename std::enable_if<std::is_base_of<ICFEXPDataWrapperBase<TData, TKey>, TWrapper>::value>::type>
659  ::get_container()
660 //--------------------------------------------------------------------------------------
661 {
662  return _container;
663 }
664 
671 
673 template <typename TValue>
675 {
676 public:
677  ICFEXPMatrixBufferBase(size_t length, std::function<TValue(size_t)> default_val) :
678  _length(length), _default_value(default_val) { }
680 
681  // pure virtual member functions
682  virtual void SetValue(size_t index, TValue value) = 0;
683  virtual TValue GetValue(size_t index) = 0;
684  virtual bool IsBufferReady() = 0;
685 
686  size_t GetBufferLength() { return _length; }
687 protected:
688  // default value getter
689  std::function<TValue(size_t)> _default_value;
690 private:
691  size_t _length;
692 };
693 
700 
702 template <typename TValue>
704  : public ICFEXPMatrixBufferBase<TValue>
705 {
706 public:
707  CFEXPMatrixBufferArray(size_t length, std::function<TValue(size_t)> default_val);
709 
710  // override virtual member functions
711  virtual void SetValue(size_t index, TValue value) override { _buffer.get()[index] = value; };
712  virtual TValue GetValue(size_t index) override { return _buffer.get()[index]; };
713  virtual bool IsBufferReady() override { return _buffer; };
714 protected:
715  // [no protected members] -----------------------------
716 private:
717  Ptr<TValue> _buffer;
718 };
719 
720 // member functions
722 //--------------------------------------------------------------------------------------
723 template <typename TValue>
724 CFEXPMatrixBufferArray<TValue>::CFEXPMatrixBufferArray(size_t length, std::function<TValue(size_t)> default_val)
725  : ICFEXPMatrixBufferBase<TValue>(length, default_val),
726  _buffer(CFEXPDataManager<TValue>::SafeAllocInstanceArray(GetBufferLength()))
727 //--------------------------------------------------------------------------------------
728 {
729  if (!default_val)
730  return;
731  size_t indx;
732  FEXPCOMMON_FOREACH(FEXPCOMMON_DEFAULT_INDX, _buffer.GetArrLength(), indx)
733  SetValue(indx, _default_value(indx));
734 }
735 
742 
744 template <typename TValue>
746  : public ICFEXPMatrixBufferBase<TValue>
747 {
748 public:
749  CFEXPMatrixBufferStdVector(size_t length, std::function<TValue(size_t)> default_val);
751 
752  // override virtual member functions
753  virtual void SetValue(size_t index, TValue value) override { _buffer->at(index) = value; };
754  virtual TValue GetValue(size_t index) override { return _buffer->at(index); };
755  virtual bool IsBufferReady() override { return bool(_buffer); };
756 protected:
757  // [no protected members] -----------------------------
758 private:
759  Ptr<std::vector<TValue>> _buffer;
760 };
761 
762 // member functions
764 //--------------------------------------------------------------------------------------
765 template <typename TValue>
766 CFEXPMatrixBufferStdVector<TValue>::CFEXPMatrixBufferStdVector(size_t length, std::function<TValue(size_t)> default_val)
767  : ICFEXPMatrixBufferBase<TValue>(length, default_val),
768  _buffer(CFEXPDataManager<std::vector<TValue>>::SafeAllocInstance(GetBufferLength()))
769 //--------------------------------------------------------------------------------------
770 {
771  if (!default_val)
772  return;
773  size_t indx;
774  FEXPCOMMON_FOREACH(FEXPCOMMON_DEFAULT_INDX, _buffer->size() - 1, indx)
775  SetValue(indx, _default_value(indx));
776 }
777 
784 
786 template <typename TValue>
788  : public ICFEXPMatrixBufferBase<TValue>
789 {
790 public:
791  CFEXPMatrixBufferStdMap(size_t length, std::function<TValue(size_t)> default_val);
793 
794  // override virtual member functions
795  virtual void SetValue(size_t index, TValue value) override;
796  virtual TValue GetValue(size_t index) override;
797  virtual bool IsBufferReady() override { return _buffer; };
798 protected:
799  // [no protected members] -----------------------------
800 private:
801  size_t _length;
803 };
804 
805 // member functions
807 //--------------------------------------------------------------------------------------
808 template <typename TValue>
809 CFEXPMatrixBufferStdMap<TValue>::CFEXPMatrixBufferStdMap(size_t length, std::function<TValue(size_t)> default_val)
810  : ICFEXPMatrixBufferBase<TValue>(length, default_val),
811  _buffer(CFEXPDataManager<std::map<size_t, TValue>>::SafeAllocInstance()) { }
812 //--------------------------------------------------------------------------------------
813 
814 //--------------------------------------------------------------------------------------
815 template <typename TValue>
816 void CFEXPMatrixBufferStdMap<TValue>::SetValue(size_t index, TValue value)
817 //--------------------------------------------------------------------------------------
818 {
819  if (index >= _length)
820  FEXPCOMMON_EXCEPTION("Error: Index is out of buffer length!!!");
821  _buffer->at(index) = value;
822 }
823 
824 //--------------------------------------------------------------------------------------
825 template <typename TValue>
827 //--------------------------------------------------------------------------------------
828 {
829  // check if index has been already set
830  if (!_buffer->count(index))
831  return _default_value(index);
832  return _buffer->at(index);
833 }
834 
841 // primary template
842 template<template<typename> typename TBuffer, typename TValue, typename Enable = void>
843 class CFEXPMatrixBase { };
846 template<template<typename> typename TBuffer, typename TValue>
848  // specialization
849  <TBuffer, TValue, typename std::enable_if<std::is_base_of<ICFEXPMatrixBufferBase<TValue>, TBuffer<TValue>>::value>::type>
850 {
851 public:
852  CFEXPMatrixBase(size_t length, std::function<TValue(size_t)> default_val);
853  virtual ~CFEXPMatrixBase() { }
854 
855  bool SetValue(size_t index, TValue value);
856  TValue GetValue(size_t index);
857 
858  // pure virtual member functions
859  virtual std::string Serialize () = 0;
860  virtual void Deserialize(const std::string & data) = 0;
861 protected:
862  // [no protected members] -----------------------------
863 private:
864  Ptr<TBuffer<TValue>> _buffer;
865 };
866 
867 // member functions
869 //--------------------------------------------------------------------------------------
870 template<template<typename> typename TBuffer, typename TValue>
872  ::CFEXPMatrixBase(size_t length, std::function<TValue(size_t)> default_val)
873  : _buffer(CFEXPDataManager<TBuffer<TValue>>::SafeAllocInstance(length, default_val)) { }
874 //--------------------------------------------------------------------------------------
875 
876 //--------------------------------------------------------------------------------------
877 template<template<typename> typename TBuffer, typename TValue>
879  ::SetValue(size_t index, TValue value)
880 //--------------------------------------------------------------------------------------
881 {
882 #define MATRIX_ERROR_SET "Error: Matrix is not initialized: \"Set Action\"!!!"
883  if (!_buffer || !_buffer->IsBufferReady())
885 
886  auto result = true;
887  if (index >= _buffer->GetBufferLength())
888  return !result;
889 
890  _buffer->SetValue(index, value);
891  return result;
892 }
893 
894 //--------------------------------------------------------------------------------------
895 template<template<typename> typename TBuffer, typename TValue>
897  ::GetValue(size_t index)
898 //--------------------------------------------------------------------------------------
899 {
900 #define MATRIX_ERROR_GET "Error: Matrix is not initialized: \"Get Action\"!!!"
901  if (!_buffer || !_buffer->IsBufferReady())
903 
904  return _buffer->GetValue(index);
905 }
906 
913 
915 template <typename TValue>
917  : public CFEXPMatrixBase<CFEXPMatrixBufferStdVector, TValue>
918 {
919 public:
920  CFEXPGeneralMatrix2DVect(size_t rows, size_t cols, std::function<TValue(size_t)> default_val);
922 
923  bool SetValue (size_t row, size_t col, TValue value);
924  TValue GetValue (size_t row, size_t col);
925  // get and set value of transpose matrix
926  bool SetValueT(size_t row, size_t col, TValue value);
927  TValue GetValueT(size_t row, size_t col);
928 
929  // dimensions of 2D matrix
930  size_t GetRows() const { return _rows; }
931  size_t GetCols() const { return _cols; }
932 protected:
933  // [no protected members] -----------------------------
934 private:
935  size_t _rows;
936  size_t _cols;
937  size_t get_array_length(size_t rows, size_t cols) const;
938  size_t get_array_index (size_t row , size_t col ) const;
939 };
940 
941 // member functions
943 //--------------------------------------------------------------------------------------
944 template <typename TValue>
945 CFEXPGeneralMatrix2DVect<TValue>::CFEXPGeneralMatrix2DVect(size_t rows, size_t cols, std::function<TValue(size_t)> default_val)
946  : CFEXPMatrixBase<CFEXPMatrixBufferStdVector, TValue>(get_array_length(rows, cols), default_val), _rows(rows), _cols(cols) { }
947 //--------------------------------------------------------------------------------------
948 
949 //--------------------------------------------------------------------------------------
950 template <typename TValue>
951 bool CFEXPGeneralMatrix2DVect<TValue>::SetValue(size_t row, size_t col, TValue value)
952 //--------------------------------------------------------------------------------------
953 {
954  return CFEXPMatrixBase<CFEXPMatrixBufferStdVector, TValue>::SetValue(get_array_index(row, col), value);
955 }
956 
957 //--------------------------------------------------------------------------------------
958 template <typename TValue>
959 TValue CFEXPGeneralMatrix2DVect<TValue>::GetValue(size_t row, size_t col)
960 //--------------------------------------------------------------------------------------
961 {
962  return CFEXPMatrixBase<CFEXPMatrixBufferStdVector, TValue>::GetValue(get_array_index(row, col));
963 }
964 
965 template <typename TValue>
966 //--------------------------------------------------------------------------------------
967 bool CFEXPGeneralMatrix2DVect<TValue>::SetValueT(size_t row, size_t col, TValue value)
968 //--------------------------------------------------------------------------------------
969 {
970  return SetValue(col, row, value);
971 }
972 
973 template <typename TValue>
974 //--------------------------------------------------------------------------------------
975 TValue CFEXPGeneralMatrix2DVect<TValue>::GetValueT(size_t row, size_t col)
976 //--------------------------------------------------------------------------------------
977 {
978  return GetValue(col, row);
979 }
980 
981 //--------------------------------------------------------------------------------------
982 template <typename TValue>
983 size_t CFEXPGeneralMatrix2DVect<TValue>::get_array_length(size_t rows, size_t cols) const
984 //--------------------------------------------------------------------------------------
985 {
986  return rows * cols;
987 }
988 
989 //--------------------------------------------------------------------------------------
990 template <typename TValue>
991 size_t CFEXPGeneralMatrix2DVect<TValue>::get_array_index(size_t row, size_t col) const
992 //--------------------------------------------------------------------------------------
993 {
994  return row * _cols + col;
995 }
996 
1003 
1006  : public CFEXPGeneralMatrix2DVect<t_fexpcommon_ct>
1007 {
1008 public:
1009  CFEXPMatrix2D(size_t rows, size_t cols)
1011  std::function<t_fexpcommon_ct(size_t)>() /*[&](size_t idx)->t_fexpcommon_ct {return FEXPCOMMON_DEFAULT_VALUE; }*/) { }
1012  virtual ~CFEXPMatrix2D() { }
1013 
1014  // override pure virtual member functions
1015  virtual std::string Serialize () override;
1016  virtual void Deserialize(const std::string & data) override;
1017 protected:
1018  // [no protected members] -----------------------------
1019 private:
1020  // [no private members ] -----------------------------
1021 };
1022 
1028 
1031 {
1032 public:
1033  static std::string WCharToStringASCII(const wchar_t* toconvert, const char vicchar = FEXPCOMMON_QUEST_MARK_CHAR, std::locale & local = std::locale());
1034  static std::vector<std::string> SplitString(const std::string & str, const std::string & delim);
1035  template<typename TValue>
1036  typename std::enable_if<std::is_arithmetic<TValue>::value, TValue>::type
1037  static StringToNumber(const std::string & strnum);
1038  static std::string & CFEXPBaseConvers::StrLtrim(std::string & str);
1039  static std::string & CFEXPBaseConvers::StrRtrim(std::string & str);
1040  static std::string & CFEXPBaseConvers::StrTrim (std::string & str);
1041  template<typename TValue>
1042  typename std::enable_if<std::is_arithmetic<TValue>::value, std::string>::type
1043  static NumberToString(TValue value);
1044  template<typename TValue>
1045  typename std::enable_if<std::is_floating_point<TValue>::value, int>::type
1046  static Compare(TValue value1, TValue value2, TValue eps = FEXPCOMMON_DEFAULT_VALUE);
1047 protected:
1048  // [no protected members] -----------------------------
1049 private:
1050  // [no private members ] -----------------------------
1051 };
1052 
1053 // member functions
1055 //--------------------------------------------------------------------------------------
1056 template<typename TValue>
1057 typename std::enable_if<std::is_arithmetic<TValue>::value, TValue>::type
1058 CFEXPBaseConvers::StringToNumber(const std::string & strnum)
1059 //--------------------------------------------------------------------------------------
1060 {
1061  try
1062  {
1063  TValue value;
1064  std::stringstream stream(strnum);
1065  stream >> value;
1066  if (stream.fail())
1067  FEXPCOMMON_EXCEPTION(strnum);
1068  return value;
1069  }
1070  catch (const std::exception&)
1071  {
1072  return 0;
1073  }
1074 }
1075 
1076 //--------------------------------------------------------------------------------------
1077 template<typename TValue>
1078 typename std::enable_if<std::is_arithmetic<TValue>::value, std::string>::type
1080 //--------------------------------------------------------------------------------------
1081 {
1082  std::ostringstream stream;
1084  {
1085  stream.precision(GET_FLT_PRECIS_DIGIT(TValue));
1086  stream << std::scientific << value;
1087  }
1088  else
1089  stream << value;
1090  return stream.str();
1091 }
1092 
1093 #define FEXPCOMMON_COMPARE_EQ 0
1094 #define FEXPCOMMON_COMPARE_1V 1
1095 #define FEXPCOMMON_COMPARE_2V 2
1096 //--------------------------------------------------------------------------------------
1097 template<typename TValue>
1098 typename std::enable_if<std::is_floating_point<TValue>::value, int>::type
1099 static CFEXPBaseConvers::Compare(TValue value1, TValue value2, TValue eps)
1100 //--------------------------------------------------------------------------------------
1101 {
1102  if (eps == FEXPCOMMON_DEFAULT_VALUE)
1103  eps = GET_MIN_FLT_VAL(TValue);
1104  if (abs(value2 - value1) <= eps)
1105  return FEXPCOMMON_COMPARE_EQ;
1106  else if (value1 > value2)
1107  return FEXPCOMMON_COMPARE_1V;
1108  else if (value1 < value2)
1109  return FEXPCOMMON_COMPARE_2V;
1110  FEXPCOMMON_EXCEPTION("Error: Floating point comparision error!!!");
1111 }
1112 
1119 {
1120 public:
1122 protected:
1123  // [no protected members] -----------------------------
1124 private:
1125  // [no private members ] -----------------------------
1126 };
1127 
1133 template<typename TValue>
1135  : public ICFEXPValueConverterBase
1136 {
1137 public:
1138  TValue GetValue(const std::string & text) { return CFEXPBaseConvers::StringToNumber<TValue>(text); }
1139 protected:
1140  // [no protected members] -----------------------------
1141 private:
1142  // [no private members ] -----------------------------
1143 };
1144 
1145 // template specialization
1146 template<>
1147 class CFEXPValueConverter<std::string>
1148  : public ICFEXPValueConverterBase
1149 {
1150 public:
1151  std::string GetValue(const std::string & text) { return text; };
1152 protected:
1153  // [no protected members] -----------------------------
1154 private:
1155  // [no private members ] -----------------------------
1156 };
1157 
1163 //https://stackoverflow.com/questions/18277304/using-stdcout-in-multiple-threads
1165  : public std::ostringstream
1166 {
1167 public:
1168  CFEXPSafeConcurencyConsolePrint() = default;
1170 protected:
1171  // [no protected members] -----------------------------
1172 private:
1173  static std::mutex _mtx_print;
1174 };
1175 
1182 {
1183 public:
1184  static void WriteLine(std::string line);
1185  static void WriteLine();
1186 protected:
1187  // [no protected members] -----------------------------
1188 private:
1189  // [no private members ] -----------------------------
1190 };
1191 
1197 std::string GetModulePath();
1198 
1204 std::string GetConfigPath(std::string fname) noexcept(false);
1205 
1211 std::tuple<std::string, size_t, std::string, size_t>
1212 GetCmdContent(int argc, char* argv[]) noexcept(false);
1213 
1219 void TRACE(const char* format, ...);
1220 
1221 #endif // !_CFEXPCOMMON_H_
Definition: FEXPCommon.h:92
Definition: FEXPCommon.h:101
#define FEXPCOMMON_EMPTY
Definition: FEXPCommon.h:178
#define FEXPCOMMON_CLCFLT_TYPE_NAME
Definition: FEXPCommon.h:199
std::function< TReturnType(Args...)> f_type
Definition: FEXPCommon.h:243
#define FEXPCOMMON_QUEST_MARK_CHAR
Definition: FEXPCommon.h:186
General 2D matrix based on std::vector.
Definition: FEXPCommon.h:916
std::tuple< std::string, size_t, std::string, size_t > GetCmdContent(int argc, char *argv[]) noexcept(false)
Definition: FEXPCommon.cpp:199
#define GET_MIN_FLT_VAL(type)
Definition: FEXPCommon.h:209
Definition: FEXPCommon.h:1164
bool SetValue(size_t row, size_t col, TValue value)
Definition: FEXPCommon.h:951
virtual std::string Serialize() override
Definition: FEXPCommon.cpp:8
#define FEXPCOMMON_DATA_TYPE_NAME(type)
Definition: FEXPCommon.h:193
ICFEXPMatrixBufferBase(size_t length, std::function< TValue(size_t)> default_val)
Definition: FEXPCommon.h:677
CFEXPMatrix2D(size_t rows, size_t cols)
Definition: FEXPCommon.h:1009
Matrix memory based on std::vector.
Definition: FEXPCommon.h:745
static Ptr< TType > MakeAllocInstanceArraySafe(TType *alloc, size_t length)
Definition: FEXPCommon.h:419
CFEXPGeneralMatrix2DVect(size_t rows, size_t cols, std::function< TValue(size_t)> default_val)
Definition: FEXPCommon.h:945
static std::enable_if< std::is_arithmetic< TValue >::value, TValue >::type StringToNumber(const std::string &strnum)
Definition: FEXPCommon.h:1058
2D matrix for floating point data.
Definition: FEXPCommon.h:1005
#define FEXPCOMMON_FOREACH(start, end, index)
Definition: FEXPCommon.h:153
virtual void SetValue(size_t index, TValue value) override
Definition: FEXPCommon.h:753
std::function< TReturnType(Args...)> f_type
Definition: FEXPCommon.h:250
Definition: FEXPCommon.h:228
ICFEXPDataWrapperBase(Ptr< TData > &data)
Definition: FEXPCommon.h:454
Matrix memory based on std::map.
Definition: FEXPCommon.h:787
static CFEXPSmartPointer< TTo > SafeSmartPtrDnmcCast(const CFEXPSmartPointer< TType > &from)
Definition: FEXPCommon.h:340
#define FEXPCOMMON_STACAST(clsfrom, clsto, variable)
Definition: FEXPCommon.h:137
#define GET_FLT_PRECIS_DIGIT(type)
Definition: FEXPCommon.h:214
static Ptr< TType > MakeAllocInstanceSafe(TType *alloc)
Definition: FEXPCommon.h:400
Definition: FEXPCommon.h:96
Definition: FEXPCommon.h:108
Base interface for matrixe memory.
Definition: FEXPCommon.h:674
virtual ~CFEXPMatrixBufferStdVector()
Definition: FEXPCommon.h:750
static std::string & StrTrim(std::string &str)
Definition: FEXPCommon.cpp:119
Matrix memory based on a simple array.
Definition: FEXPCommon.h:703
std::function< TValue(size_t)> _default_value
Definition: FEXPCommon.h:689
virtual ~ICFEXPMatrixBufferBase()
Definition: FEXPCommon.h:679
virtual ~CFEXPGeneralMatrix2DVect()
Definition: FEXPCommon.h:921
virtual void SetValue(size_t index, TValue value)=0
CFEXPSmartPointer()
Definition: FEXPCommon.h:279
Definition: FEXPCommon.h:276
virtual TValue GetValue(size_t index) override
Definition: FEXPCommon.h:826
double t_fexpcommon_ct
Definition: FEXPCommon.h:120
size_t GetBufferLength()
Definition: FEXPCommon.h:686
Definition: FEXPCommon.h:110
CFEXPSmartPointer< TType > MakeClone() const
Definition: FEXPCommon.h:350
virtual void SetValue(size_t index, TValue value) override
Definition: FEXPCommon.h:711
virtual bool IsBufferReady() override
Definition: FEXPCommon.h:755
CFEXPMatrixBufferStdVector(size_t length, std::function< TValue(size_t)> default_val)
Definition: FEXPCommon.h:766
#define FEXPCOMMON_COMPARE_1V
Definition: FEXPCommon.h:1094
CFEXPMatrixBufferArray(size_t length, std::function< TValue(size_t)> default_val)
Definition: FEXPCommon.h:724
TValue GetValueT(size_t row, size_t col)
Definition: FEXPCommon.h:975
virtual TValue GetValue(size_t index)=0
virtual ~CFEXPDataManager()
Definition: FEXPCommon.h:379
bool SetValueT(size_t row, size_t col, TValue value)
Definition: FEXPCommon.h:967
static std::string WCharToStringASCII(const wchar_t *toconvert, const char vicchar=FEXPCOMMON_QUEST_MARK_CHAR, std::locale &local=std::locale())
Definition: FEXPCommon.cpp:51
#define FEXPCOMMON_DEFAULT_INDX
Definition: FEXPCommon.h:171
size_t GetCols() const
Definition: FEXPCommon.h:931
static CFEXPSmartPointer< TTo > SafeSmartPtrStatCast(const CFEXPSmartPointer< TType > &from)
Definition: FEXPCommon.h:330
std::string GetConfigPath(std::string fname) noexcept(false)
Definition: FEXPCommon.cpp:181
Definition: FEXPCommon.h:100
size_t GetRows() const
Definition: FEXPCommon.h:930
Ptr< TData > _data
Definition: FEXPCommon.h:445
Definition: FEXPCommon.h:1118
#define MATRIX_ERROR_SET
virtual ~CFEXPSafeConcurencyConsolePrint()
Definition: FEXPCommon.cpp:134
Definition: FEXPCommon.h:98
static std::enable_if< std::is_arithmetic< TValue >::value, std::string >::type NumberToString(TValue value)
Definition: FEXPCommon.h:1079
Definition: FEXPCommon.h:843
virtual TValue GetValue(size_t index) override
Definition: FEXPCommon.h:712
virtual ~CFEXPMatrixBufferArray()
Definition: FEXPCommon.h:708
#define FEXPCOMMON_EXCEPTION(error_text)
Definition: FEXPCommon.h:143
virtual TValue GetValue(size_t index) override
Definition: FEXPCommon.h:754
std::string GetValue(const std::string &text)
Definition: FEXPCommon.h:1151
function_traits< TLambda >::f_type make_function(TLambda value)
Definition: FEXPCommon.h:261
CFEXPSmartPointer< TType > & operator=(const CFEXPSmartPointer< TType > &source)
Definition: FEXPCommon.h:320
virtual ~CFEXPMatrixBufferStdMap()
Definition: FEXPCommon.h:792
virtual void Deserialize(const std::string &data) override
Definition: FEXPCommon.cpp:31
#define FEXPCOMMON_COMPARE_EQ
Definition: FEXPCommon.h:1093
virtual ~CFEXPSmartPointer()
Definition: FEXPCommon.h:282
EFEXPFiniteElementType
Type of FE.
Definition: FEXPCommon.h:106
Definition: FEXPCommon.h:112
Definition: FEXPCommon.h:113
static std::string & StrLtrim(std::string &str)
Definition: FEXPCommon.cpp:99
#define FEXPCOMMON_FOREACH_ITER(data)
Definition: FEXPCommon.h:156
#define FEXPCOMMON_COMPARE_2V
Definition: FEXPCommon.h:1095
virtual TKey GetKey()=0
virtual void SetValue(size_t index, TValue value) override
Definition: FEXPCommon.h:816
static std::enable_if< std::is_floating_point< TValue >::value, int >::type Compare(TValue value1, TValue value2, TValue eps=FEXPCOMMON_DEFAULT_VALUE)
Definition: FEXPCommon.h:1181
static Ptr< TType > SafeAllocInstance(VarArgs &&... inpar)
It allocates data.
Definition: FEXPCommon.h:392
static std::string & StrRtrim(std::string &str)
Definition: FEXPCommon.cpp:109
void SetToNull()
Definition: FEXPCommon.h:295
virtual bool IsBufferReady()=0
EFEXPFiniteElementGeom
Type of FE geometry.
Definition: FEXPCommon.h:90
virtual bool IsBufferReady() override
Definition: FEXPCommon.h:713
std::function< TReturnType(Args...)> f_type
Definition: FEXPCommon.h:257
#define MAP_PAIR(key, itm)
Definition: FEXPCommon.h:471
Ptr< TData > GetData()
Definition: FEXPCommon.h:441
#define FEXPCOMMON_DEFAULT_VALUE
Definition: FEXPCommon.h:179
virtual ~ICFEXPValueConverterBase()
Definition: FEXPCommon.h:1121
Base wrapper for items in container.
Definition: FEXPCommon.h:434
Definition: FEXPCommon.h:86
static void WriteLine()
Definition: FEXPCommon.cpp:154
Definition: FEXPCommon.h:235
Definition: FEXPCommon.h:475
static Ptr< TType > SafeAllocInstanceArray(size_t length)
It allocates data array.
Definition: FEXPCommon.h:410
Smart pointer.
Definition: FEXPCommon.h:274
TValue GetValue(const std::string &text)
Definition: FEXPCommon.h:1138
Definition: FEXPCommon.h:94
#define MATRIX_ERROR_GET
std::string GetModulePath()
Definition: FEXPCommon.cpp:166
TValue GetValue(size_t row, size_t col)
Definition: FEXPCommon.h:959
size_t GetArrLength() const
Definition: FEXPCommon.h:296
virtual bool IsBufferReady() override
Definition: FEXPCommon.h:797
CFEXPMatrixBufferStdMap(size_t length, std::function< TValue(size_t)> default_val)
Definition: FEXPCommon.h:809
virtual ~CFEXPMatrix2D()
Definition: FEXPCommon.h:1012
#define FEXPCOMMON_DYNCAST(clsfrom, clsto, variable)
Definition: FEXPCommon.h:138
virtual ~ICFEXPDataWrapperBase()
Definition: FEXPCommon.h:439
Definition: FEXPCommon.h:1134
static std::vector< std::string > SplitString(const std::string &str, const std::string &delim)
Definition: FEXPCommon.cpp:63
void TRACE(const char *format,...)
Definition: FEXPCommon.cpp:225
General functions for various conversions.
Definition: FEXPCommon.h:1030